package Logica.Gestores;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import AccesoADatos.ConexionOracle;
import AccesoADatos.PuntajeDAO;
import Excepciones.FiguraDelPartidoSinPuntaje;
import Logica.Entidades.EquipoDePrimera;
import Logica.Entidades.Formacion;
import Logica.Entidades.Jugador;
import Logica.Entidades.Partido;
import Logica.Entidades.Puntaje;
import Presentacion.Interfaz;

public class GestorPuntaje {
	private PuntajeDAO puntajeDAO;
	private Interfaz padre;

	public GestorPuntaje(Interfaz i){
		super();
		padre = i;
		puntajeDAO = new PuntajeDAO();
	}
	
	public int sumatoriaDePuntos(int nroFecha, Formacion formacion){
		return 0;
	}
	
	public void validarDatos(int calificacionpartido, int golesconvertidos, int golesrecibidos, boolean amarilla, boolean roja, int penalesconvertidos, int penaleserrados, int penalesatajados, boolean figuracancha, int golesencontra, boolean jugo20min){
	
	}

	public void cargarPorJugador(int calificacionpartido, int golesconvertidos, int golesrecibidos, boolean amarilla, boolean roja, int vpenalesconvertidos, int penaleserrados, int penalesatajados, boolean figuracancha, int golesencontra, boolean jugo20min){
		
	}
	
	public void guardarDatos(Puntaje p, int nFecha){
		
		char tarjeta = 'n';

		String t = p.getTarjeta();
		if(t.equals("Amarilla"))
			tarjeta = 'a';
		else if(t.equals("Roja"))
			tarjeta = 'r';
		
		puntajeDAO.guardarDatos(p,tarjeta,nFecha);
	}
	
	public Puntaje obtenerPuntaje(int nroFecha, Jugador jugador){
		int idJugador = jugador.getId();
		Puntaje puntaje;
		List<List<String>> puntajesDto = puntajeDAO.obtenerPuntaje(nroFecha, idJugador);
		if (puntajesDto.size() != 0){
			Integer calificacion = new Integer(puntajesDto.get(0).get(2));
			String tarjetaAuxiliar = puntajesDto.get(0).get(3);
			String tarjeta;
			if (tarjetaAuxiliar.equals("a")){
				tarjeta = new String("Amarilla");
			}
			else if (tarjetaAuxiliar.equals("r")){
				tarjeta = new String("Roja");
			}
			else {
				tarjeta = new String("Ninguna");
			}
			Integer esFigura = new Integer(puntajesDto.get(0).get(4));
			Integer golesRecibidos = new Integer(puntajesDto.get(0).get(5));
			Integer golesEnContra = new Integer(puntajesDto.get(0).get(6));
			Integer golesConvertidos = new Integer(puntajesDto.get(0).get(7));
			Integer jugoMasDe20 = new Integer(puntajesDto.get(0).get(8));
			Integer penalesConvertidos = new Integer(puntajesDto.get(0).get(9));
			Integer penalesErrados = new Integer(puntajesDto.get(0).get(10));
			Integer penalesAtajados = new Integer(puntajesDto.get(0).get(11));
			
			// Para la valla invicta se necesitan los goles del equipo contrario al que pertenece el jugador
			GestorPartido gpa = padre.getGestorPartido();
			GestorEquipoDePrimera gedp = padre.getGestorEquipoDePrimera();
			EquipoDePrimera equipo = gedp.buscarEquipoPrimera(jugador);
			int idEquipo = equipo.getIdEquipo();
			int golesRecibidosPorElEquipo = gpa.getGolesRecibidosPorElEquipo(idJugador, nroFecha, idEquipo);
			
			puntaje = new Puntaje(calificacion.intValue(), tarjeta, esFigura.intValue(), golesRecibidos.intValue(), golesEnContra.intValue(), golesConvertidos.intValue(), jugoMasDe20.intValue(), penalesConvertidos.intValue(), penalesErrados.intValue(), penalesAtajados.intValue(), jugador, golesRecibidosPorElEquipo);
		}
		else {
			Integer jugoMasDe20 = 0;
			puntaje = new Puntaje(jugoMasDe20, jugador);
		}
		
		return puntaje;
	}
		
	public int sumatoriaDePuntos(int nroFecha, Puntaje puntaje){
		int puntos = 0;
		puntos = puntaje.sumatoriaDePuntos();
		return puntos;
	}
	
	public static boolean validarPuntaje(Partido partido){
		
		if(partido.getEstado()==0)
			return false;
		else
			return true;
		
	}

	public List<Puntaje> obtenerPuntajePorPartido(Partido partido) {
		List<Puntaje> puntajes = new ArrayList<Puntaje>();
		List<Jugador> jugadoresTotal = new ArrayList<Jugador>();
		List<Jugador> jugadoresEquipo1 = partido.getEquipo1().getPlantel();
		List<Jugador> jugadoresEquipo2 = partido.getEquipo2().getPlantel();
		jugadoresTotal.addAll(jugadoresEquipo1);
		jugadoresTotal.addAll(jugadoresEquipo2);
		for(Jugador j : jugadoresTotal){
			Puntaje p = obtenerPuntaje(partido.getNroFecha(), j);
			if(!p.esPuntajeVacio())
				puntajes.add(p);
		}
		return puntajes;
	}

	public void actualizarPuntaje(Puntaje p, Puntaje puntajeViejo, int nFecha) {
		int calificacion = -1,esFigura=-1,golesRecibidos=-1,golesEnContra=-1,golesConvertidos=-1,jugo20=-1,penalesConvertidos=-1,penalesErrados=-1,penalesAtajados=-1;
		boolean modificado = false;
		
		if(p.getCalificacion() != puntajeViejo.getCalificacion()){
			calificacion = p.getCalificacion();
			modificado = true;
		}
		if(p.getEsFigura() != puntajeViejo.getEsFigura()){
			esFigura = p.getEsFigura();
			modificado = true;
		}
		if(p.getGolesRecibidos() != puntajeViejo.getGolesRecibidos()){
			golesRecibidos = p.getGolesRecibidos();
			modificado = true;
		}
		if(p.getGolesEnContra() != puntajeViejo.getGolesEnContra()){
			golesEnContra = p.getGolesEnContra();
			modificado = true;
		}
		if(p.getGolesConvertidos() != puntajeViejo.getGolesConvertidos()){
			golesConvertidos = p.getGolesConvertidos();
			modificado = true;
		}
		if(p.getJugoMasDe20() != puntajeViejo.getJugoMasDe20()){
			jugo20 = p.getJugoMasDe20();
			modificado = true;
		}
		if(p.getPenalesConvertidos() != puntajeViejo.getPenalesConvertidos()){
			penalesConvertidos = p.getPenalesConvertidos();
			modificado = true;
		}
		if(p.getPenalesErrados() != puntajeViejo.getPenalesErrados()){
			penalesErrados = p.getPenalesErrados();
			modificado = true;
		}
		if(p.getPenalesAtajados() != puntajeViejo.getPenalesAtajados()){
			penalesAtajados = p.getPenalesAtajados();
			modificado = true;
		}
		
		char tarjeta = p.getTarjeta().toLowerCase().charAt(0);
		
		if(modificado)
			puntajeDAO.actualizarPuntajes(p.getJugador().getId(),nFecha,calificacion,esFigura,golesRecibidos,golesEnContra,golesConvertidos,jugo20,penalesConvertidos,penalesErrados,penalesAtajados,tarjeta);
	}

	public void guardarFigura(int nroFecha, int idJugador) throws FiguraDelPartidoSinPuntaje {
		List<List<String>> obtenerPuntajeDto = puntajeDAO.obtenerPuntaje(nroFecha,idJugador);
		
		if(obtenerPuntajeDto.size() != 0){
			puntajeDAO.guardarFigura(nroFecha,idJugador);
		}
		else {
			throw new FiguraDelPartidoSinPuntaje();
		}
	}
	
	public void quitarFigura(int nroFecha, int idJugador) {
		List<List<String>> obtenerPuntajeDto = puntajeDAO.obtenerPuntaje(nroFecha,idJugador);
		if(obtenerPuntajeDto.size() != 0){
			puntajeDAO.quitarFigura(nroFecha,idJugador);
		}
	}

	public void borrarPuntajes(Partido partido) {
		
		List<Jugador> jugadoresPartido = new ArrayList<Jugador>();
		jugadoresPartido.addAll(partido.getEquipo1().getPlantel());
		jugadoresPartido.addAll(partido.getEquipo2().getPlantel());
		puntajeDAO.borrarPuntajes(jugadoresPartido,partido.getNroFecha());
		
	}
	
}
